home *** CD-ROM | disk | FTP | other *** search
/ Power Bytes: Money & Finance / PowerBytes Money and Finance CD-ROM 01 / PowerBytes Money and Finance CD-ROM 01.iso / MacII / IFSFractals / IFS.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-03-28  |  6.3 KB  |  303 lines  |  [TEXT/KAHL]

  1. #include <simple.h>        
  2. #include <Quickdraw.h>
  3. #include <pascal.h>
  4. #include <math.h>
  5. #include <ToolboxUtil.h>
  6. #include <OSUtil.h>
  7.  
  8. int RECT[4]={290,240,310,512};    
  9. double Trans[4][7];
  10. double xscale,xoffset,yscale,yoffset;
  11. int *Tptr;
  12. long int totiters,bits;
  13. static char *mdragon="Dragon Params/D";
  14. static char *mfern="Fern Params/F";
  15. static char *mspiral="Spiral Params/P";
  16. static char *msquare="Square Params/S";
  17. static char *mtree="Tree Params/R";
  18. static char *mtriangle="Triangle Params/T";
  19. static char *mitem;
  20.  
  21. CursHandle c;
  22. WindowPtr windp;
  23.     
  24. ifscompute()            
  25. {
  26.     extern int RECT[4];
  27.     extern double Trans[4][7];
  28.     extern long int totiters,bits;
  29.     extern double xscale;
  30.     extern double xoffset;
  31.     extern double yscale;
  32.     extern double yoffset;
  33.     
  34.     double x=0.0,y=0.0,temp=0.0;
  35.     double newx,newy;
  36.     int Probtrans[3];
  37.     int xx,yy;
  38.     int pk,k,n;
  39.     int count=0,newbits=0;
  40.     char out[255];
  41.  
  42.     withwindow ("IFS");
  43.     ShowWindow(windowpoint("IFS"));
  44.     SelectWindow(windowpoint("IFS"));
  45.  
  46.     TextSize(9);
  47.     TextFont(4);
  48.     TextFace(0);
  49.     c=GetCursor(watchCursor);
  50.     SetCursor(*c);
  51.     randSeed=Time;
  52.     
  53.   for (n=0 ; n<=3 ; n++)
  54.         {
  55.             temp=Trans[n][6]+temp;
  56.             Probtrans[n]=temp*32767;
  57.         }
  58.     for ( n=-20 ; n<=4999 ; n++)
  59.         {
  60.             pk=Random();
  61.             if(pk<0) pk=-pk;
  62.             
  63.             if (pk<=Probtrans[0]) k=0;
  64.             else if (pk<=Probtrans[1]) k=1;
  65.             else if (pk<=Probtrans[2]) k=2;
  66.             else k=3;
  67.             
  68.             newx=Trans[k][0]*x + Trans[k][1]*y + Trans[k][4];
  69.             newy=Trans[k][2]*x + Trans[k][3]*y + Trans[k][5];
  70.             x=newx;
  71.             y=newy;
  72.             if (n<0) continue;
  73.             ++totiters;
  74.             xx=(int) floor(0.5 + xoffset + xscale*x);
  75.             if (xx<1) xx=1;
  76.             if (xx>512) xx=512;
  77.             yy=(int) floor(0.5 + yoffset + yscale*y);
  78.             if (yy<1) yy=1;
  79.             if (yy>312) yy=312;
  80.             sprintf(out,"%d     %d",xx,yy);
  81.             newbits=newbits + (FALSE==GetPixel(xx,yy));
  82.             MoveTo(xx,yy);
  83.             LineTo(xx,yy);
  84.             if (++count<500) 
  85.                 continue;
  86.             else
  87.                 {
  88.                     bits=bits+newbits;
  89.                     sprintf(out,"ITER =%6ld  PIXELS =%6ld  NEWPIX =%4d",totiters,bits,newbits);
  90.                     EraseRect(RECT);
  91.                     MoveTo(250,300);
  92.                     DrawString(CtoPstr(out));
  93.                     InvertRect(RECT);
  94.                     count=newbits=0;
  95.                 } 
  96.         }
  97.     InitCursor();
  98.     SysBeep(5);
  99. }
  100.  
  101.  
  102. extrainfo()
  103. {
  104.     message("By A.P. Maika/ Written in Lightspeed C¬ by THINK Technologies Inc./ Written with the aid of SimpleTools⌐ by Eric Kilk 1986");
  105. }
  106.  
  107. aboutme()
  108. {
  109.   message ("Iterated Function System: see Barnsley, M.F., Sloan, A.D., 'A Better Way to Compress Images' BYTE (January 1988) 215-223");
  110. }
  111.  
  112. counterreset()
  113. {
  114.     bits=0;
  115.     totiters=0;
  116. }
  117.  
  118. setdragonvars()
  119. {
  120.     static double dragon[4][7]={    {.0,-.5,.5,.0,-2.396462,.509384,.25},    
  121.                                                                     {.0,-.5,.5,.0,-.677228,-.866812,.25},
  122.                                                                     {.0,-.5,.5,.0,.677228,.866812,.25},
  123.                                                                     {.0,-.5,.5,.0,2.396462,-.509384,.25}};
  124.     int i,j;
  125.     
  126.     windp=windowpoint("IFS");
  127.     HideWindow(windp);
  128.     ShowWindow(windp);
  129.     for (i=0;i<=3;i++)
  130.         {
  131.             for (j=0;j<=6;j++)
  132.                 Trans[i][j]=dragon[i][j];
  133.         }
  134.     bits=0;
  135.     totiters=0;
  136.     xscale=40.0;
  137.     xoffset=250.0;
  138.     yscale=40.0;
  139.     yoffset=150.0;
  140.     menu("Commands",mitem,itemuncheck);
  141.     mitem=mdragon;
  142.     menu("Commands",mitem,itemcheck);
  143. }
  144.  
  145. setfernvars()
  146. {
  147.     static double fern[4][7]={    {.16,.0,.0,.0,.0,.0,.01},    
  148.                                                             {.22,.23,-.26,.2,1.6,.0,.07},
  149.                                                             {.24,.26,.28,-.15,.44,.0,.07},
  150.                                                             {.85,-.04,.04,.85,1.6,.0,.85}};
  151.     int i,j;
  152.     
  153.     windp=windowpoint("IFS");
  154.     HideWindow(windp);
  155.     ShowWindow(windp);
  156.     for (i=0;i<=3;i++)
  157.         {
  158.             for (j=0;j<=6;j++)
  159.                 Trans[i][j]=fern[i][j];
  160.         }
  161.     bits=0;
  162.     totiters=0;
  163.     xscale=50.0;
  164.     xoffset=-3.0;
  165.     yscale=53.0;
  166.     yoffset=130.0;
  167.     menu("Commands",mitem,itemuncheck);
  168.     mitem=mfern;
  169.     menu("Commands",mitem,itemcheck);
  170. }
  171.  
  172. setspiralvars()
  173. {
  174.     static double spiral[4][7]={{-.164992,.164992,-.164992,-.164992,-5.2,5.2,.14},    
  175.                                                             {.832299,.302932,-.302932,.832299,2.2,.9,.86},
  176.                                                             {.0,.0,.0,.0,.0,.0,.0},
  177.                                                             {.0,.0,.0,.0,.0,.0,.0}};
  178.     int i,j;
  179.     
  180.     windp=windowpoint("IFS");
  181.     HideWindow(windp);
  182.     ShowWindow(windp);
  183.     for (i=0;i<=3;i++)
  184.         {
  185.             for (j=0;j<=6;j++)
  186.                 Trans[i][j]=spiral[i][j];
  187.         }
  188.     bits=0;
  189.     totiters=0;
  190.     xscale=16.0;
  191.     xoffset=200.0;
  192.     yscale=16.0;
  193.     yoffset=150.0;
  194.  
  195.     menu("Commands",mitem,itemuncheck);
  196.     mitem=mspiral;
  197.     menu("Commands",mitem,itemcheck);
  198. }
  199.  
  200. setsquarevars()
  201. {
  202.     static double square[4][7]={{.5,.0,.0,.5,.0,.0,.25},    
  203.                                                             {.5,.0,.0,.5,.5,.0,.25},
  204.                                                             {.5,.0,.0,.5,.0,.5,.25},
  205.                                                             {.5,.0,.0,.5,.5,.5,.25}};
  206.     int i,j;
  207.     
  208.     windp=windowpoint("IFS");
  209.     HideWindow(windp);
  210.     ShowWindow(windp);
  211.     for (i=0;i<=3;i++)
  212.         {
  213.             for (j=0;j<=6;j++)
  214.                 Trans[i][j]=square[i][j];
  215.         }
  216.     bits=0;
  217.     totiters=0;
  218.     xscale=200.0;
  219.     xoffset=155.0;
  220.     yscale=200.0;
  221.     yoffset=45.0;
  222.     menu("Commands",mitem,itemuncheck);
  223.     mitem=msquare;
  224.     menu("Commands",mitem,itemcheck);
  225. }
  226.  
  227. settreevars()
  228. {
  229.     static double tree[4][7]={    {.0,.0,.0,.5,.0,.0,.05},    
  230.                                                             {.1,.0,.0,.1,.0,.2,.15},
  231.                                                             {.42,-.42,.42,.42,.0,.2,.40},
  232.                                                             {.42,.42,-.42,.42,.0,.2,.40}};
  233.     int i,j;
  234.     
  235.     windp=windowpoint("IFS");
  236.     HideWindow(windp);
  237.     ShowWindow(windp);
  238.     for (i=0;i<=3;i++)
  239.         {
  240.             for (j=0;j<=6;j++)
  241.                 Trans[i][j]=tree[i][j];
  242.         }
  243.     bits=0;
  244.     totiters=0;
  245.     xscale=1000.0;
  246.     xoffset=254.0;
  247.     yscale=-800.0;
  248.     yoffset=365.0;
  249.     
  250.     menu("Commands",mitem,itemuncheck);
  251.     mitem=mtree;
  252.     menu("Commands",mitem,itemcheck);
  253. }
  254.  
  255. settrianglevars()
  256. {
  257.     static double triangle[4][7]={    {.5,.0,.0,.5,.0,.0,.333},    
  258.                                                                     {.5,.0,.0,.5,1.,.0,.333},
  259.                                                                     {.5,.0,.0,.5,.5,.5,.334},
  260.                                                                     {.0,.0,.0,.0,.0,.0,.000}};
  261.     int i,j;
  262.     
  263.     windp=windowpoint("IFS");
  264.     HideWindow(windp);
  265.     ShowWindow(windp);
  266.     for (i=0;i<=3;i++)
  267.         {
  268.             for (j=0;j<=6;j++)
  269.                 Trans[i][j]=triangle[i][j];
  270.         }
  271.     bits=0;
  272.     totiters=0;
  273.     xscale=245.0;
  274.     xoffset=5.0;
  275.     yscale=270.0;
  276.     yoffset=5.0;
  277.     menu("Commands",mitem,itemuncheck);
  278.     mitem=mtriangle;
  279.     menu("Commands",mitem,itemcheck);
  280. }
  281.  
  282. main ()
  283. {
  284.   simpletools ("About IFS...");            
  285.   menu (applestring,"About IFS...", aboutme);
  286.   menu (applestring, "About IFS...", itemenable);
  287.   menu ("Edit","",itemdisable);
  288.   simplequits();
  289.   windmenu=FALSE;
  290.     window ("IFS", 0, 38, 512, 342,stnop,counterreset,stnop,stnop);
  291.   menu ("Commands","Extra Info",extrainfo);                            
  292.   menu ("Commands","Iterate 5,000x/I",ifscompute);
  293.   menu ("Commands",mdragon,setdragonvars);
  294.   menu ("Commands",mfern,setfernvars);
  295.   menu ("Commands",mspiral,setspiralvars);
  296.   menu ("Commands",msquare,setsquarevars);
  297.   menu ("Commands",mtree,settreevars);
  298.   menu ("Commands",mtriangle,settrianglevars);
  299.   mitem=mtriangle;
  300.   settrianglevars();
  301.     for (;;) simpleevents ();
  302. }
  303.